//////////////////////////////////////////////////////////////////////////

#ifndef _LOADER_H_
#define _LOADER_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _BUFFER_H_
#include "buffer.h"
#endif

#ifndef _CLIENTINPUTPACKET_H_
#include "clientinputpacket.h"
#endif

#ifndef _SERVERINFOPACKET_H_
#include "serverinfopacket.h"
#endif

#ifndef _SERVERSTATEPACKET_H_
#include "serverstatepacket.h"
#endif

#ifndef _CLIENTINFOPACKET_H_
#include "clientinfopacket.h"
#endif

//////////////////////////////////////////////////////////////////////////


/** This class loads objects from buffer
*
*
*  @author   Anastasia Karpinska
*  @since    Nov 15th, 2009
*  @updated  Nov 15th, 2009
*/
class Loader
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////

    /** Constructor */
    Loader( const Buffer& _buffer );


    /** Loads server state packet */
    ServerStatePacket LoadServerStatePacket();


    /** Loads server info packet */
    ServerInfoPacket LoadServerInfoPacket();


    /** Loads client info packet */
    ClientInfoPacket LoadClientInfoPacket();


    /** Loads client input packet */
    ClientInputPacket LoadClientInputPacket();


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Loads player */
    Player LoadPlayer();


    /** Loads bullet */
    Bullet LoadBullet();


    /** Loads wall */
    Wall LoadWall();


    /** Loads game object */
    template <typename ObjT>
    ObjT LoadObject();


//////////////////////////////////////////////////////////////////////////


    /** Loads client input */
    ClientInput LoadClientInput();


    /** Loads client info */
    ClientInfo LoadClientInfo();


    /** Loads server state */
    ServerState LoadServerState();


    /** Loads server info */
    ServerInfo LoadServerInfo();


//////////////////////////////////////////////////////////////////////////


    /** Saver buffer */
    Buffer m_Buffer;


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////

